/**
 * @file FileIO.h
 * @brief 文件输入输出处理类的声明
 * 
 * 该类提供了高性能的文件读写功能，主要用于处理网格数据。
 * 核心特性：
 * 1. 使用内存映射实现高效文件读取
 * 2. 支持大文件处理
 * 3. 提供数据压缩功能
 * 4. 支持Windows和POSIX系统
 */
#pragma once
#include <string>
#include <vector>
#include "GridStructs.h"

class FileIO {
public:
    /**
     * @brief 内存映射文件类
     * 
     * 提供跨平台的内存映射文件访问功能，
     * 支持Windows和POSIX系统
     */
    class MemoryMappedFile {
    public:
        MemoryMappedFile();
        ~MemoryMappedFile();
        
        bool open(const std::string &filename, size_t &fileSize);
        void *getData() const;
        
    private:
        #ifdef _WIN32
        void *hFile;     ///< Windows文件句柄
        void *hMapping;  ///< Windows文件映射句柄
        #else
        int fd;          ///< POSIX文件描述符
        size_t length;   ///< 映射长度
        #endif
        void *data;      ///< 映射的内存指针
    };

    static GridData grid_data;  // 添加静态成员变量

    /**
     * @brief 读取网格文件
     * @param filename 输入文件路径
     * @param grid_data 输出参数，存储网格数据
     * @throw std::runtime_error 当文件读取失败时抛出异常
     * 
     * 使用内存映射方式高效读取大文件:
     * 1. 预分配足够大的向量空间避免频繁扩容
     * 2. 使用大缓冲区优化IO性能
     * 3. 支持数据压缩格式
     */
    static void readGridFile(const std::string &filename, GridData &grid_data);

    /**
     * @brief 保存VTK格式的网格文件
     * @param filename 输出文件路径
     * @param data 处理后的网格数据
     * @throw std::runtime_error 当文件写入失败时抛出异常
     * 
     * 写入优化策略:
     * 1. 使用二进制模式提高写入速度
     * 2. 使用大缓冲区减少IO操作
     * 3. 批量写入数据
     */
    static void writeVTKFile(const std::string &filename, const ProcessedData &data);

    /**
     * @brief 保存断层节点信息到文件
     * @param filename 输出文件路径
     * @param data 处理后的网格数据
     * @throw std::runtime_error 当文件写入失败时抛出异常
     * 
     * 输出断层节点的详细信息:
     * 1. 节点编号
     * 2. 空间坐标
     * 3. 相关的单元信息
     */
    static void writeFaultNodesFile(const std::string &filename, const ProcessedData &data);

private:
    /**
     * @brief 检查文件是否存在
     * @param filename 要检查的文件路径
     * @return 文件存在且可访问时返回true
     * @throw std::runtime_error 当文件不存在或无法访问时抛出异常
     */
    static bool checkFileExists(const std::string &filename);

    /**
     * @brief 解析网格数据行
     * @param line 要解析的数据行
     * @param keyword 当前关键字
     * @param grid_data 网格数据存储对象
     * 
     * 高效的数据解析:
     * 1. 使用快速字符串转数字函数
     * 2. 支持压缩格式(n*value)
     * 3. SIMD优化的数值解析
     */
    static void processGridLine(const std::string &line,
                              const std::string &keyword,
                              GridData &grid_data);

    /**
     * @brief 快速字符串转浮点数
     * @param p 字符串指针
     * @return 转换后的浮点数
     * 
     * 优化的数值转换:
     * 1. 避免std::stod的开销
     * 2. 手动解析提高性能
     * 3. 处理科学计数法
     */
    static double fastStringToDouble(const char* &p);

    /**
     * @brief 快速字符串转整数
     * @param p 字符串指针
     * @return 转换后���整数
     * 
     * 优化的整数转换:
     * 1. 避免std::stoi的开销
     * 2. 手动解析提高性能
     */
    static int fastStringToInt(const char* &p);
}; 